/*************************************************************************
                           Triangle  -  description
                             -------------------
    début                : 21 févr. 2012
    copyright            : (C) 2012 par francois
*************************************************************************/

//---------- Interface de la classe <Triangle> (fichier Triangle.h) ------
#if ! defined ( TRIANGLE_H_ )
#define TRIANGLE_H_

//--------------------------------------------------- Interfaces utilisées
#include "Point2D.h"

namespace livgeo {

//------------------------------------------------------------- Constantes 

//------------------------------------------------------------------ Types 

//------------------------------------------------------------------------ 
// Rôle de la classe <Triangle>
//
//
//------------------------------------------------------------------------ 

class Triangle
{
//----------------------------------------------------------------- PUBLIC

public:
//----------------------------------------------------- Méthodes publiques

	Point2D getP1() const { return p1; }

	Point2D getP2() const { return p2; }

	Point2D getP3() const { return p3; }

    void createBoundingBox(Point2D& botLeft, Point2D& topRight);
    // Crée le rectangle englobant ce triangle. Il est créée en affectant les
    // paramètres de sortie botLeft (coin inférieur gauche) et topRight(coin
    // suppérieur droit)

    bool contains(const Point2D& p);
    // Renvoie vrai si le triangle contient le point <p>, sinon renvoie faux

    bool intersectWith(const Vector2D& dir, const Point2D& p1, const Point2D& p2, Point2D& res);
    // Renvoie vrai si le triangle intersecte avec le segment constitué des
    // points <p1> et <p2>, sinon retourne faux. Le segment en question n'est
    // pas orienté.

    bool static LineIntersect(const Point2D& p1, const Point2D& p2,
    		const Point2D& p3, const Point2D& p4, Point2D& outP);

//------------------------------------------------- Surcharge d'opérateurs

//-------------------------------------------- Constructeurs - destructeur

    Triangle ( const Point2D& a, const Point2D& b, const Point2D& c);
    // Crée un triangle avec <a>, <b> et <c> non orienté

    Triangle (const Point2D& center, float angleDirection, float angleFov,
    		float radius);
    // Crée un triangle isocèle de longueur <radius> dont le sommet principal
    // est <center>. Ce sommet forme un angle de <angleFov> avec les deux
    // autres sommets. La bissectrice de l'angle du sommet principal forme un
    // angle orienté de <angleDirection> avec l'axe Y du repère.

    virtual ~Triangle ( );
    // Destructeur

//------------------------------------------------------------------ PRIVE 

protected:
//----------------------------------------------------- Méthodes protégées

//----------------------------------------------------- Attributs protégés
    Point2D p1;
    Point2D p2;
    Point2D p3;
};

//--------------------------- Autres définitions dépendantes de <Triangle>

}; // ------ fin de livgeo

#endif // TRIANGLE_H_
